#include <bits/stdc++.h>
using namespace std;
typedef struct lnode
{
    int data;
    struct lnode *next;
} lnode, *linklist;
// 原地逆置带头结点的单链表
// 尾插法建立单链表
void createlist(linklist &l)
{
    l = (lnode *)malloc(sizeof(lnode));
    l->next = nullptr;
    lnode *r = l, *s;
    int x;
    cout << "输入结点值" << endl;
    cin >> x;
    while (x != 999)
    {
        s = (lnode *)malloc(sizeof(lnode));
        s->data = x;
        s->next = nullptr;
        r->next = s;
        r = s;
        cout << "输入结点值,999结束输入" << endl;
        cin >> x;
    }
    r = nullptr;
}
void printlist(linklist l)
{
    lnode *p = l->next;
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
// 使用头插法原地逆置单链表
void reverse(linklist &l)
{
    // p为工作指针，r指向p的后继防止断链
    lnode *p, *r;
    // p指向第一个元素
    p = l->next;
    // 摘下头结点
    l->next = nullptr;
    while (p)
    {
        // 暂存p的后继
        r = p->next;
        // p作为新结点用头插法插入链表
        p->next = l->next;
        l->next = p;
        // p指针后移
        p = r;
    }
}

int main(int argc, char const *argv[])
{
    linklist l;
    createlist(l);
    printlist(l);
    reverse(l);
    printlist(l);
    system("pause");
    return 0;
}
